package com.note.middleware.document;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 请求日志文档类
 * 对应MongoDB中的日志记录
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "request_logs")
public class RequestLog {
    
    /**
     * 文档ID
     */
    @Id
    private String id;
    
    /**
     * 请求ID（唯一标识）
     */
    @Indexed(unique = true)
    private String requestId;
    
    /**
     * 请求时间
     */
    @Indexed
    private LocalDateTime requestTime;
    
    /**
     * 响应时间
     */
    private LocalDateTime responseTime;
    
    /**
     * 处理耗时（毫秒）
     */
    private Long processingTime;
    
    /**
     * 请求URI
     */
    @Indexed
    private String requestUri;
    
    /**
     * 请求方法（GET, POST等）
     */
    @Indexed
    private String requestMethod;
    
    /**
     * 请求参数（URL参数）
     */
    private Map<String, String[]> requestParams;
    
    /**
     * 请求体（JSON格式）
     */
    private String requestBody;
    
    /**
     * 请求头信息
     */
    private Map<String, String> headers;
    
    /**
     * 客户端IP
     */
    @Indexed
    private String clientIp;
    
    /**
     * 用户代理（User-Agent）
     */
    private String userAgent;
    
    /**
     * 响应状态码
     */
    @Indexed
    private Integer responseStatus;
    
    /**
     * 响应体（JSON格式）
     */
    private String responseBody;
    
    /**
     * 是否发生异常
     */
    @Indexed
    private Boolean hasException;
    
    /**
     * 异常信息（如果有）
     */
    private String exceptionMessage;
    
    /**
     * 异常堆栈（如果有）
     */
    private String exceptionStack;
    
    /**
     * 用户ID（如果有）
     */
    @Indexed
    private Long userId;
    
    /**
     * 用户名（如果有）
     */
    private String username;
    
    /**
     * 操作类型
     */
    @Indexed
    private String operationType;
    
    /**
     * 模块名称
     */
    @Indexed
    private String module;
    
    /**
     * 操作描述
     */
    private String description;
    
    /**
     * 创建时间
     */
    @Indexed
    private LocalDateTime createdTime;
} 